﻿using System;
using UnityEngine;
using System.Collections.Generic;

namespace Asset
{
    public class PoolObj : MonoBehaviour
    {
        //bundle名称
        [SerializeField]
        private string resUrl;
        public string ResUrl
        {
            get
            {
                return this.resUrl;
            }
            set
            {
                if (string.IsNullOrEmpty(resUrl))
                {
                    this.resUrl = value;
                    this.staticDepends = PoolMgr.getDeps(this.resUrl);
                    if (this.staticDepends != null)
                    {
                        for (int i = 0; i < staticDepends.Length; i++)
                        {
                            PoolMgr.addRef(staticDepends[i]);
                        }
                    }
                    this.addDymicRefByBundle(this.resUrl);
                }
            }
        }
        //静态引用
        [SerializeField]
        private string[] staticDepends;
        //动态引用
        [SerializeField]
        private List<string> dymicDepends = new List<string>();

        public void addDymicRefByBundle(string bundleName)
        {
            if (!string.IsNullOrEmpty(bundleName))
            {
                dymicDepends.Add(bundleName);
                PoolMgr.addRef(bundleName);
            }
        }
        public void addDymicRefByAsset(string assetName)
        {
            this.addDymicRefByBundle(PoolMgr.getBundleName(assetName));
        }

        private void OnDestroy()
        {
            if (this.staticDepends != null)
            {
                for (int i = 0; i < staticDepends.Length; i++)
                {
                    PoolMgr.subRef(staticDepends[i]);
                }
            }
            if (this.dymicDepends != null)
            {
                for (int i = 0; i < dymicDepends.Count; i++)
                {
                    PoolMgr.subRef(dymicDepends[i]);
                }
            }
        }
    }
    /*
     * 引用计数
     * Q1:一个Model(角色Prefab)
     * 假设它的引用只有静态引用 在出池子的时候给静态引用的bundle的RefCount++
     * 在销毁的时候(不是回收) 把静态引用的bundle的RefCount--
     * 
     * Q2:一个UI(UI Prefab)
     * 例如：SkillUI 它的bundle引用了 commonAtlas  引用了skillAtlas  引用了 2张散图 Tex01  Tex02
     * 那么SkillUI依赖4个bundle
     * 操作1：当UI加载出来的时候 给这4个依赖的bunle的RefCount++
     * 操作2：当SkillUI打开时候,做了一个操作,把UI上的一个Image的Sprite动态设置为 Tex03
     *               那么SkillUI动态引用了 Tex03,这个时候需要在这个UI的dymicDepends.add(Tex03.bundle)
     * 操作3：1.还是把上个Image的Sprite设置一下,设置为Tex02
     *               虽然Tex02已经在静态引用列表中,可以判断静态引用中是否有这个,如果没有加入到动态中,如果有则不操作
     *               2.但是并不想每次动态引用的时候去做这个判断
     *               动态引用,直接加入到动态引用列表中,UI销毁的时候,把所有动态引用--,依旧可以保证计数正确
     *               但是这样会造成:UI的Image虽然动态引用过Tex03,但是又重新引用了一个Tex02,理论上Tex03没有引用了,会导致Tex03.bundle的RefCount一直在
     *               
     *Q3:一个PrefabA,可能会有其他Prefab设置Parent=PrefabA
     *      例如：角色Prefab,有武器挂点,翅膀挂点
     *                  那么销毁角色实体的时候,先把这些挂点的Prefab做销毁(回收)
     *      例如：UI Prefab,一个UI下面有4个页签(例如门派下面 页签1：门派信息页面  页签2：门派成员页面   页签3：门派活动页面   页签4：门派商店页面)
     *                  这4个页签都是一个单独的Prefab,会动态加载,然后挂在到UI预留的节点上
     *                  那么在UI销毁的时候,也应该先把4页签Prefab销毁(回收)
     *                  
     *Q4:添加引用计数的时机
     *      Prefab实例化的时候都会AddComponent<PoolObj>脚本
     *      PoolObj脚本会初始化静态依赖 并给依赖的bundle.RefCount++(Prefab也会依赖自己的bundle 添加到了动态引用中)
     *      当Prefab动态引用一个Asset,例如一个UI Prefab动态设置Image.Sprite = xx,不管是同步设置还是异步设置,直接添加对Asset的bundle引用
    */
}
